\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{fancyhdr}
\usepackage{graphicx}
\pagestyle{fancy}
\lhead{Ver. 1.0 - Projektrapport}

%opening
\title{Xtreme Fickparking \\
     Real Time Systems - FRTN01 \\
     Project supervisor: Karl Berntorp}
\author{Erik Söderqvist, dt08es8@student.lth.se \\
   Johan Paulsson, dt08jp8@student.lth.se \\
   Jacob Ferm, dt08jf0@student.lth.se}

\begin{document}

\maketitle
\begin{center}
\includegraphics[scale=0.15]{frontpage.jpg}
\end{center}


\newpage

\section{Introduktion}
Vi har byggt en legobil som har haft i uppgift att fickparkera i en parkeringsruta. Samtliga delar till bilen kommer från ett lego mindstorm-set och den använder en motor för styrning, en motor för framdrivning samt tre avståndssensorer för att mäta avstånd till föremål framför, bakom och vid högersidan av bilen. Mjukvaran för processen har utvecklats i LeJos.

\subsection{Konstanter}

\begin{tabular}{|l|l|} \hline
\textbf{Konstant} & \textbf{Värde} \\ \hline
Bilens längd & 22,5 cm \\ \hline
Bilens bredd & 16 cm \\ \hline
Bilens svängradie & 17 cm \\ \hline
Hjulens omkrets & 17,6 cm \\ \hline
\end{tabular}

\section{Programstruktur}
\subsection{Beskrivning av implementationen}
Programmet har en huvudklass som heter Main och den startar alla trådar och monitorer. Main-klassen börjar med att starta tre monitorer som har attribut för avstånden framför, bakom och vid sidan av bilen. Monitorerna skickas in tillsammans med motsvarande Ultrasonicsensor i tre stycken avstånds-trådar som kontinuerligt uppdaterar monitorerna med värden från sensorerna på bilen. Denna uppdatering sker med ett intervall på 100 millisekunder. Därefter skickas monitorerna in i Controller-tråden och den startas. Det är Controller-tråden som sköter all styrning av motorerna efter att ha hämtat information från monitorerna. Det finns även en ButtonListener som kontinuerligt kontrollerar om ESCAPE-knappen har blivit nedtryckt. Detta gör den var 100 millisekund och om knappen har blivit nedtryckt avslutas programmet. Ett UML-diagram över programstrukturen kan ses i figur 1.

\subsection{Beskrivning av processen}
I Appendix B finns bilderna som vi kommer referera till i detta avsnitt. Som synes i figur \ref{seq1} står bilen i utgångsläge och sidosensorn detekterar att den står nära en bil. Det är viktigt för resten av parkeringen att bilen står parallellt med den första bilen och att framhjulen är raka annars kommer parkeringen med stor sannolikhet misslyckas.
Därefter kör bilen fram tills sidosensorn detekterar att där står en ny bil och avståndet den kört beräknas för att kontrollera om bilen kommer få plats i parkeringsplatsen. Detta avståndet används i nästa steg som kan ses i figur \ref{seq2} där bilen backar in i parkeringsplatsen. Den backar först halva avståndet med hjulen svängda åt höger och sedan halva avståndet med hjulen svängda åt vänster.
Detta följs av att bilen backar längst bak i parkeringsfickan där den sedan mäter avståndet från framsensorn som den använder för att beräkna hur långt den kan svänga åt först höger och sedan vänster för att inte köra in i bilen framför. Detta kan ses i figur \ref{seq3}.
Därefter backar bilen längst bak i parkeringsfickan samtidigt som den mäter om avståndet från sidosensorn förändras. Detta skulle betyda att bilen står snett och i så fall utför den en kort korregering. Stegen som syns i \ref{seq3} och \ref{seq4} upprepas därefter tills bilen står inom ett förbestämt avstånd från trottoaren. Slutligen ställer sig bilen i mitten av parkeringsrutan vilket visas i figur \ref{seq5}.

\begin{figure}[h]
\begin{center}
\resizebox{!}{75mm}{\includegraphics{uml.png}}
\label{uml}
\caption{Uml-diagram över implementationen.}                               
\end{center}
\end{figure}


\section{Regulatordesign}

Den största delen av fickparkeringen är algoritmbaserad och den använder sensorerna för att detektera när den ska byta algoritmer. Controller-tråden kontroller avståndet till föremål framför och bakom bilen under tiden den utför parkeringsalgoritmen för att säkerställa att den inte kör in i något föremål. Den kontrollerar även sidosensorn för att detektera när bilen står tillräckligt långt in i parkeringsfickan för att parkeringen ska anses vara klar.

\section{Användarmanual}

Man startar upp Lego Mindstorm-enheten genom att trycka på ENTER. För att starta programmet väljer man ``Run default''. Om man gjort rätt kommer det stå ``Press any button to start the program!'' på skärmen. Därefter ska man ställa bilen så att sidosensorn pekar på fordonet som står bakom parkeringsfickan man vill parkera i. Sedan kan man trycka på vilken knapp man vill på enheten för att starta programmet och sen kommer den parkera av sig själv. När programmet har kört klart och inte kommer längre in i parkeringsfickan kommer det stå ``Parking completed!'' på skärmen tills man trycker på någon knapp då lego mindstorm-enheten automatiskt startar om sig själv. Om man vill avbryta exekveringen av programmet trycker man på ESCAPE varpå lego mindstorm-enheten automatiskt startar om sig själv.


\section{Resultat}
För att mäta hur effektivt bilen lyckades parkera utförde vi tolv stycken parkeringar och mätte resultaten. Parkeringsrutans längd var 38,5 cm och djupet var 20,0 cm. Längden hade bestämts till en och en halv gånger bilens längd plus 5 cm extra marginal för att kompensera för att sensorerna inte klarar av att mäta kortare avstånd. Av de tolv försöken misslyckades tre stycken totalt då bilen körde in i en av de parkerade bilarna. Resterande resultat presenteras i följande sektioner. Bilder av försöket kan ses i Appendix A.

\subsection{Försök 1}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 2 cm \\ \hline
Avstånd till andra bilen & 2 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 9 cm \\ \hline
Avstånd till bakre bilen & 14 cm \\ \hline
Avstånd till trottoaren & 9 cm \\ \hline
Tid för parkeringen & 52 s \\ \hline
Antal iterationer av adjust-metoden & 5 st \\ \hline
Antal iterationer av korrektions-metoden & 3 st\\ \hline \hline
\end{tabular}

\subsection{Försök 2}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 2,5 cm \\ \hline
Avstånd till andra bilen & 4 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 9 cm \\ \hline
Avstånd till bakre bilen & 14 cm \\ \hline
Avstånd till trottoaren & 7 cm \\ \hline
Tid för parkeringen & 39 s \\ \hline
Antal iterationer av adjust-metoden & 3 st \\ \hline
Antal iterationer av korrektions-metoden & 2 st\\ \hline \hline
\end{tabular}

\subsection{Försök 3}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 2,5 cm \\ \hline
Avstånd till andra bilen & 6 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 10 cm \\ \hline
Avstånd till bakre bilen & 13 cm \\ \hline
Avstånd till trottoaren & 8 cm \\ \hline
Tid för parkeringen & 21 s \\ \hline
Antal iterationer av adjust-metoden & 0 st \\ \hline
Antal iterationer av korrektions-metoden & 1 st\\ \hline \hline
\end{tabular}

\subsection{Försök 4}
I detta försöket snuddade bilen vid den bakre bilen vid en backning.\\\\
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 2 cm \\ \hline
Avstånd till andra bilen & 9 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 10 cm \\ \hline
Avstånd till bakre bilen & 14 cm \\ \hline
Avstånd till trottoaren & 6 cm \\ \hline
Tid för parkeringen & 19 s \\ \hline
Antal iterationer av adjust-metoden & 0 st \\ \hline
Antal iterationer av korrektions-metoden & 0 st\\ \hline \hline
\end{tabular}    

\subsection{Försök 5}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 2 cm \\ \hline
Avstånd till andra bilen & 4 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 11 cm \\ \hline
Avstånd till bakre bilen & 13 cm \\ \hline
Avstånd till trottoaren & 7 cm \\ \hline
Tid för parkeringen & 19 s \\ \hline
Antal iterationer av adjust-metoden & 0 st \\ \hline
Antal iterationer av korrektions-metoden & 0 st\\ \hline \hline
\end{tabular}

\subsection{Försök 6}
I detta försöket snuddade bilen vid den bakre bilen vid en backning.\\\\
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 3 cm \\ \hline
Avstånd till andra bilen & 5 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 10 cm \\ \hline
Avstånd till bakre bilen & 14 cm \\ \hline
Avstånd till trottoaren & 7 cm \\ \hline
Tid för parkeringen & 21 s \\ \hline
Antal iterationer av adjust-metoden & 0 st \\ \hline
Antal iterationer av korrektions-metoden & 1 st\\ \hline \hline
\end{tabular}

\subsection{Försök 7}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 6 cm \\ \hline
Avstånd till andra bilen & 6 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 9 cm \\ \hline
Avstånd till bakre bilen & 14 cm \\ \hline
Avstånd till trottoaren & 8 cm \\ \hline
Tid för parkeringen & 38 s \\ \hline
Antal iterationer av adjust-metoden & 4 st \\ \hline
Antal iterationer av korrektions-metoden & 0 st\\ \hline \hline
\end{tabular}

\subsection{Försök 8}
När detta försöket var avslutat visade baksensorn ett avstånd på 27 cm fast den stod alldeles intill den bakre bilen vilket betyder att sensorn gav fel output.\\\\
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 4 cm \\ \hline
Avstånd till andra bilen & 4 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 20 cm \\ \hline
Avstånd till bakre bilen & 27 cm \\ \hline
Avstånd till trottoaren & 9 cm \\ \hline
Tid för parkeringen & 46 s \\ \hline
Antal iterationer av adjust-metoden & 5 st \\ \hline
Antal iterationer av korrektions-metoden & 1 st\\ \hline \hline
\end{tabular}

\subsection{Försök 9}
\begin{tabular}{|l|l|} \hline
\textbf{Mätpunkt} & \textbf{Mätvärde} \\ \hline
Avstånd till första bilen & 4 cm \\ \hline
Avstånd till andra bilen & 4 cm \\ \hline \hline
\textbf{Efter avslutad parkering} &  \\ \hline
Avstånd till främre bilen & 11 cm \\ \hline
Avstånd till bakre bilen & 13 cm \\ \hline
Avstånd till trottoaren & 8 cm \\ \hline
Tid för parkeringen & 19 s \\ \hline
Antal iterationer av adjust-metoden & 0 st \\ \hline
Antal iterationer av korrektions-metoden & 0 st\\ \hline \hline
\end{tabular}

\newpage
\section{Slutsatser}
%Sensorerna suger
%Motorerna glappar
%Styraxeln glappar
%Ratio på hur ofta killen klarar det!
%hjulen kasar/glider (underlag?)

Som det syns i den föregående sektion klarar bilen nio av tolv försök vilken ger att bilen klarar att utföra en fickparkering 75\% av fallen. De misslyckade försöken beror på att motorerna och styraxeln glappar vilket betyder att bilen inte kan köra rakt fram på ett tillförlitligt sätt. Detta leder till att bilen kan ställas i fel läge då den ska påbörja inbackningen.

Tack vare begränsningarna på sensorerna blev det problem då algoritmerna baserades på indata från dessa. Detta kunde leda till bilen körde för långt eller kort och krockade med bilarna. Det gjorde det även svårt att bedöma om bilen stod snett eller inte.

Vi märkte att hjulen kasar lite grann på underlaget när den svänger. Detta gör att bilen inte alltid utnygttjar sin maximala svängradie vilket minskar effektiviteten.

Vår implementation hade inte kunnat användas på riktigt eftersom den är specialgjord för att kompensera för alla begränsningar i hårdvaran som finns. Men att vidareutveckla den till att fungera på en fullstor bil hade inte givit så mycket extraarbete om man hade kunnat litat på all indata.

\newpage

\section{Appendix A}


\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.10]{park1.jpg}
\end{center}
\end{figure}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.10]{park2.jpg}
\end{center}
\end{figure}
\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.10]{park3.jpg}
\end{center}
\end{figure}
\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.10]{park4.jpg}
\end{center}
\end{figure}

.\newpage

.\newpage

%.\\\\\\\\\\\\\\\\\\\\\\\\\\\

\section{Appendix B}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.65]{seq1.png}
\end{center}
\caption{Bilens startläge innan den mäter upp hur stor parkeringsplatsen är.}
\label{seq1}
\end{figure}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.65]{seq2.png}
\end{center}
\caption{Bilen då den ska påbörja den första inbackningen i parkeringsplatsen.}
\label{seq2}
\end{figure}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.65]{seq3.png}
\end{center}
\caption{Bilens läge då adjust-metoden ska påbörjas för att köra bilen djupare in i parkerinsplatsen.}
\label{seq3}
\end{figure}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.65]{seq4.png}
\end{center}
\caption{Andra delen av adjust-metoden då bilen backar och rätar upp sig.}
\label{seq4}
\end{figure}

\begin{figure}[!h]
\begin{center}
\includegraphics[scale=0.65]{seq5.png}
\end{center}
\caption{Bilens läge efter avslutad parkering.}
\label{seq5}
\end{figure}

\end{document}